#ifndef __DIAGNOSTIC_H__
#define __DIAGNOSTIC_H__

// 跨编译器诊断控制宏（兼容 MSVC、GCC、Clang）
#ifdef _MSC_VER
// ------------------------------ MSVC 编译器 ------------------------------
#define DIAGNOSTIC_PUSH __pragma(warning(push)) // 保存警告状态
#define DIAGNOSTIC_POP __pragma(warning(pop))   // 恢复之警告状态

// 忽略相关告警
#define IGNORE_UNUSED_VARIABLE __pragma(warning(disable : 4101))      // 未使用的变量
#define IGNORE_UNUSED_PARAMETER __pragma(warning(disable : 4100))     // 未使用的函数参数
#define IGNORE_NON_VIRTUAL_DTOR __pragma(warning(disable : 4265))     // 类有虚函数但析构函数非虚
#define IGNORE_SIGN_CONVERSION __pragma(warning(disable : 4302))      // 符号转换可能丢失数据
#define IGNORE_IMPLICIT_FALLTHROUGH __pragma(warning(disable : 4467)) // switch隐式贯穿（未 break）
#define IGNORE_NOEXCEPT_SPEC __pragma(warning(disable : 4297))        // 函数有非抛出异常规范
#else
// ------------------- GCC/Clang 编译器（含 macOS Clang） --------------------
#define DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push")                                           // 保存警告状态
#define DIAGNOSTIC_POP _Pragma("GCC diagnostic pop")                                             // 恢复之警告状态

// 忽略相关告警
#define IGNORE_UNUSED_VARIABLE _Pragma("GCC diagnostic ignored \"-Wunused-variable\"")           // 未使用的变量
#define IGNORE_UNUSED_PARAMETER _Pragma("GCC diagnostic ignored \"-Wunused-parameter\"")         // 未使用的函数参数
#define IGNORE_NON_VIRTUAL_DTOR _Pragma("GCC diagnostic ignored \"-Wnon-virtual-dtor\"")         // 类有虚函数但析构函数非虚
#define IGNORE_SIGN_CONVERSION _Pragma("GCC diagnostic ignored \"-Wsign-conversion\"")           // 符号转换可能丢失数据
#define IGNORE_IMPLICIT_FALLTHROUGH _Pragma("GCC diagnostic ignored \"-Wimplicit-fallthrough\"") // switch 隐式贯穿（未 break）
#define IGNORE_NOEXCEPT_SPEC _Pragma("GCC diagnostic ignored \"-Wnoexcept\"")                    // 函数有非抛出异常规范

#endif

#endif // __DIAGNOSTIC_H__
